package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.User;
import com.itheima.reggie.service.UserService;
import com.itheima.reggie.utils.SMSUtils;
import com.itheima.reggie.utils.ValidateCodeUtils;
import com.sun.org.apache.xerces.internal.util.HTTPInputSource;
import javafx.scene.chart.ValueAxis;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 发送手机短信验证码
     * @param session
     * @return
     */
    @PostMapping("/sendMsg")
    public R sendMsg(@RequestBody Map<String,String> map, HttpSession session){

        //获取手机号
        String phone = map.get("phone");
        //生成随机的4位验证码
        String code = ValidateCodeUtils.generateValidateCode(4).toString();
//        String code="123456";
        log.info("发送验证码 phone:{},生成code:{}",phone,code);
        //调用阿里云提供的短信服务API完成发送短信
//        SMSUtils.sendMessage("哈哈哈","SMS_205884038",phone,code);
//        将验证码存入session
//        session.setAttribute(phone,code);

//        需要将生成的验证码保存到redis,设置过期时间
        redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
        return R.success("短信验证码已经发送");


    }
/**
 * 移动端用户登录
 * @param map
 * @param session
 * @return
 */
@PostMapping("/login")
    public R login(@RequestBody Map map, HttpSession session){
    log.info(map.toString());

    //1. 比对用户请求的验证码和session中的验证码是否一致
    //如果不一致，返回登陆失败
    //获取前端传入的手机号和验证码

    String phone = map.get("phone").toString();
    String code = map.get("code").toString();
    //获取session中的code
//   String codeInSession = (String)session.getAttribute(phone);
//    从redis获取缓存的验证码
    Object codeInSession = redisTemplate.opsForValue().get(phone);
    if(codeInSession!=null && codeInSession.equals(code)){
       //验证码不一致，返回失败
       return R.error("验证码错误");
   }
    //2. 判断用户是否存在，如果不存在，注册新用户
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
   queryWrapper.eq(User::getPhone,phone);
   User user=userService.getOne(queryWrapper);
    //用户不存在，注册新用户
    if(user==null){
        user = new User();
        user.setPhone(phone);
        user.setStatus(1);
        userService.save(user);
    }else{
        //3. 如果用户存在，判断是否禁用，如果已经禁用，登陆失败
        Integer status = user.getStatus();
        if(status==0) {
            //用户已禁用，不允许登陆
            return R.error("用户已禁用");
        }
    }
    //4. 登陆成功将用户的id存入session
    session.setAttribute("user",user.getId());
//    登陆成功后删除redis的验证码
    redisTemplate.delete(code);
    return R.success(user);

}
/**
 * 移动端用户退出
 * @param session
 * @return
 */
@PostMapping("/loginout")
    public R loginOut(HttpSession session){
        session.removeAttribute("user");
        return R.success("退出成功");

}
}
